package com.zzhua.controller;

import com.zzhua.entity.SysJob;
import com.zzhua.service.JobService;
import com.zzhua.quartz.JobTask;
import com.zzhua.utils.JsonUtil;
import com.zzhua.utils.MyException;
import com.zzhua.utils.ReType;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("job")
public class JobController {

    @Autowired
    JobService jobService;

    @Autowired
    JobTask jobTask;

    // 跳转到quartz管理界面
    @GetMapping(value = "showJob")
    public String showUser(Model model) {
        return "sys/quartz";
    }

    // 显示任务列表
    @GetMapping(value = "showJobList")
    @ResponseBody
    public ReType showUser(Model model, SysJob job, String page, String limit) {
        return jobService.show(job, Integer.valueOf(page), Integer.valueOf(limit));
    }


    @PostMapping(value = "addJob")
    @ResponseBody
    public JsonUtil addJob(SysJob job) {
        JsonUtil j = new JsonUtil();
        String msg = "保存成功";
        job.setStatus(false);
        try {
            jobService.insertSelective(job);
        } catch (MyException e) {
            msg = "保存失败";
            j.setFlag(false);
            e.printStackTrace();
        }
        j.setMsg(msg);
        return j;
    }

    @GetMapping(value = "updateJob")
    public String updateJob(String id, Model model, boolean detail) {
        if (StringUtils.isNotEmpty(id)) {
            SysJob job = jobService.selectByPrimaryKey(id);
            model.addAttribute("job", job);
        }
        model.addAttribute("detail", detail);
        return "system/job/update-job";
    }


    @PostMapping(value = "updateJob")
    @ResponseBody
    public JsonUtil updateJob(SysJob job) {
        JsonUtil j = new JsonUtil();
        j.setFlag(false);
        if (job == null) {
            j.setMsg("获取数据失败");
            return j;
        }
        // 判断scheduler是否存在triggerkey,注意暂停状态也会返回true,
        // 但是这里的停止的逻辑是直接把这个triggerkey给删除掉了
        // 因此也就是说: 如果scheduler里面有triggerkey的话,那么肯定是已经启动的状态,启动状态不能修改
        if (jobTask.checkJob(job)) {                                
            j.setMsg("已经启动任务无法更新,请停止后更新");
            return j;
        }
        if (jobService.updateJob(job)) { // 走这句,说明sceduler中不存在该triggerkey,因此直接更新
            j.setFlag(true);
            j.setData("更新成功");
        } else {
            j.setData("更新失败");
        }
        return j;
    }

    @PostMapping(value = "del")
    @ResponseBody
    public JsonUtil del(String id) {
        // 1. 从数据库中查询该job,获取到triggerkey[job的id + default]
        // 2. 判断scheduler中是否有该triggerkey,如果有,那么就不能删除,需要先停止才能删除
        return jobService.del(id); 
    }                              


    @PostMapping(value = "startJob")
    @ResponseBody
    public JsonUtil startJob(String id) {
        JsonUtil j = new JsonUtil();
        String msg = null;
        if (StringUtils.isEmpty(id)) {
            j.setMsg("获取数据失败");
            j.setFlag(false);
            return j;
        }
        if (jobService.startJob(id)) { // 1. 从数据库中查询到该job  2. 使用jobTask开启这个job
            msg = "启动成功";
        } else {
            msg = "启动失败";
        }
        j.setMsg(msg);
        return j;
    }

    @PostMapping(value = "endJob")
    @ResponseBody
    public JsonUtil endJob(String id) {
        JsonUtil j = new JsonUtil();
        String msg;
        if (StringUtils.isEmpty(id)) {
            j.setMsg("获取数据失败");
            j.setFlag(false);
            return j;
        }
        //  1.从数据库中查询该job,目的是为了获取到triggerkey[job的id + default]
        //  2. 在调度器中寻找该triggerkey找到的话，就pausetrigger，unschedulejob,deletejob一套操作
        //  3.一套操作下来，triggerkey就没了
        if (jobService.stopJob(id)) { 
            msg = "停止成功";         
        } else {                      
            msg = "停止失败";
        }
        j.setMsg(msg);
        return j;
    }

}